package es.ucm.fdi.pe.practica3.genetico3;

import java.util.ArrayList;

import es.ucm.fdi.pe.practica3.genetico3.Arbol.TipoHijo;


public class Individuo implements Comparable<Individuo> {
	private Arbol arbol;
	private double puntuacion = 0.0;
	private double punt_acum = 0.0;
	private double fitnessRankingAcumulado;
	private double fitnessRanking;
	private double fitness = -1;
	
	public Individuo(int prof_min, int prof_max){
		arbol = new Arbol(prof_min, prof_max, null, TipoHijo.R);
		this.setFitness();
	}

	public Individuo(Individuo i) {
		this.arbol = new Arbol(i.arbol);
		//this.fitness = i.fitness;
		this.puntuacion = i.puntuacion;
		this.punt_acum = i.punt_acum;
	
	}

	public static enum Orientacion {
		ESTE,SUR,OESTE,NORTE
	}
	
	/**
	 * @return the fitness
	 */
	public double getFitness() {
		return this.fitness;
	}
	
	public void setFitness() {
		Adaptacion fitness = new Adaptacion();
		try {
			this.fitness= fitness.fitnessIndividuo(this);
		} catch (Exception e) {
			System.out.println("EXCEPCION Individuo: "+e.getMessage());
		}
	}
	
	/**
	 * @return the puntuacion
	 */
	public double getPuntuacion() {
		return puntuacion;
	}

	/**
	 * @param puntuacion the puntuacion to set
	 */
	public void setPuntuacion(double puntuacion) {
		this.puntuacion = puntuacion;
	}

	/**
	 * @return the punt_acum
	 */
	public double getPunt_acum() {
		return punt_acum;
	}

	/**
	 * @param punt_acum the punt_acum to set
	 */
	public void setPunt_acum(double punt_acum) {
		this.punt_acum = punt_acum;
	}

	public int compareTo(Individuo i) {
		return (int)((this.getFitness()-i.getFitness())*10000);
	}

	public boolean esMejor(Individuo i) {
		return this.getFitness() >= i.getFitness();
	}
	
	/**
	 * Devuelve el recorrido resultante al ejecutar el codigo del programa generado.
	 * Debe devolverlo como una lista de acciones a realizar (solo avanza, gira_derecha y gira_izquierda).
	 * */
	public ArrayList<Coordenada> getRecorrido() {
		Adaptacion fitness = new Adaptacion();
		return fitness.getRecorridoFinal(this);
	}
	
	/**
	 * Devuelve todo el codigo del programa generado como texto.
	 * */
	public String getCodigo() {
		return arbol.recorridoEnProfundidad("   ");
	}

	/*public void listaRecorridoEnProfundidad() {
		this.arbol.listaRecorridoEnProfundidad();
	}*/

	public Arbol getArbol() {
		return arbol;
	}

	public void setArbol(Arbol arbol) {
		this.arbol = arbol;
	}
	
	/**
	 * @return the fitnessRanking
	 */
	public double getFitnessRanking() {
		return fitnessRanking;
	}

	/**
	 * @param fitnessRanking the fitnessRanking to set
	 */
	public void setFitnessRanking(double fitnessRanking) {
		this.fitnessRanking = fitnessRanking;
	}

	/**
	 * @return the fitnessRankingAcumulado
	 */
	public double getFitnessRankingAcumulado() {
		return fitnessRankingAcumulado;
	}

	/**
	 * @param fitnessRankingAcumulado the fitnessRankingAcumulado to set
	 */
	public void setFitnessRankingAcumulado(double fitnessRankingAcumulado) {
		this.fitnessRankingAcumulado = fitnessRankingAcumulado;
	}
	
	public static void main (String[] args){
		Individuo ind;
		for (int i=0; i<100; i++){
			ind= new Individuo(3,5);
			System.out.println("Individuo "+i+":\n"+ind.getCodigo());
		}
	}
}
